Export CSV

Export CSV 1.4 (25/08/05)

Ci-joint une version modifiée de l'exportation en format CSV des comptes.
Utilisant Ma Tirelire sur mon Palm, je modifie l'export de BP en fonction de mes besoins afin d'y importer mes comptes.
N'hésitez pas à compléter la liste des idées d'évolution...

-- Fabrice

Version temporaire en attendant les modifications de Fabio avec l'extraction des pointés/rapprochés...


Fichier concerné
C:\Program Files\BankPerfect\Scripts\Export CSV\export_csv.py
#Version 1.4 Fabrice 25/08/05 - Séparateur Catégories/Sous-Catégories
#Version 1.3 Fabrice 22/08/05 - "Chèque" plutôt que "Chq XXXXXX"
#Version 1.2 Fabrice 22/08/05 - En-tête optionnel
#Version 1.1 Fabrice 19/08/05 - Export tous comptes
#Version 1.0 Fabio

import BP
global categ_names

def GetCategName(index, sep, CreateSubCategs):
  valid_indexes = range(len(categ_names))
  if index in valid_indexes:
    # Ajoute le séparateur de sous-catégorie...
    if SeparateSubCategs:
      sep = EditSepCategs
      CreateSubCategs = 1

    # Renvoi la sous-catégorie si pas de séparateur
    if CreateSubCategs and len(sep) > 0:
      parent_index = BP.CategParent[index]
      if parent_index in valid_indexes and parent_index != index:
        return "%s%s%s" %(categ_names[parent_index], sep, categ_names[index])
      else:
        return "%s%s" %(categ_names[index], sep)
    else: return categ_names[index]
  else:
    if CreateSubCategs: return sep
    else: return ""

def parse(value):
  lines = value.replace("\r\n", "\n").replace("\r", "\n").split("\n")
  d = {}
  for line in lines:
    i = line.find("=")
    if i > -1: d[line[:i]] = line[i + 1:]
  return d

def ExportAccount(account, AllAccounts):
  categs = BP.OperationCateg[account]
  categs = [GetCategName(index, sep, CreateSubCategs) for index in categs]
  dates = BP.OperationDate[account]
  dates = [d.replace("-", "/") for d in dates]
  people = BP.Operationthirdparty[account]
  people = [p.replace(sep, " ") for p in people]
  details = BP.OperationDetails[account]
  details = [d.replace(sep, " ") for d in details]
  
  if ReplaceCheck:
    # Modes... sans numéro de chèque
    modes = []
    for m in BP.OperationMode[account]:
      m.replace(sep, " ")
      if m.find("Chq") == 0:
        m = "Chèque"
      modes.append(m)
  else:
    # Modes... original
    modes = BP.OperationMode[account]
    modes = [m.replace(sep, " ") for m in modes]

  values = BP.OperationAmount[account]
  values = [str(v).replace(".", ",") for v in values]
  lines = zip(dates, modes, people, details, categs, values)
  records = []
  if IncludeHeader: records.append(sep.join(titles))
  i = 0
  visible_lines = BP.VisibleLines()
  for line in lines:
    if AllAccounts:
      if i in visible_lines:
        records.append(sep.join(line))
      i += 1
    else:
      records.append(sep.join(line))

  csv_file = BP.BankPerfectFileName()
  if csv_file[-3:] == ".bp": csv_file = csv_file[:-3]
  csv_file = "%s-%s.csv" %(csv_file, BP.AccountName[account])
  try:
    open(csv_file, "w").write("\n".join(records))
    BP.MsgBox("Le fichier %s a été créé" %csv_file, 0)
  except:
    BP.MsgBox("Impossible de créer le fichier %s" %csv_file, 0)

  return ""
#_______________________________________________________________________________
form = """
checkbox=CheckBoxAllAccounts;Left=20;Top=6;Width=224;Anchors=tl;Caption=Exporter tous les comptes;Checked=0
label=LabelSep;Left=20;Top=32;Width=104;Anchors=tl;Caption=Séparateur à utiliser :;
combo=ComboSep;Left=136;Top=28;Width=56;Anchors=tl;Text=\s\\r\\n,\\r\\nTAB\\r\\n;ItemIndex=0
radio=RadioSepSubCategs;Left=20;Top=52;Width=206;Anchors=tl;Caption=Séparateur Catégories/Sous-catégories;Checked=0
edit=EditSepCategs;Left=232;Top=50;Width=20;Anchors=tl;Text=/;
radio=RadioCreateSubCategs;Left=20;Top=72;Width=226;Anchors=tl;Caption=Créer une colonne pour les sous-catégories;Checked=1
checkbox=CheckBoxHeader;Left=20;Top=94;Width=224;Anchors=tl;Caption=Inclure l'en-tête;Checked=1
checkbox=CheckBoxCheck;Left=20;Top=114;Width=224;Anchors=tl;Caption=Remplacer "Chq XXXXXX" par "Chèque";Checked=0
button=ButtonCancel;Left=55;Top=150;Width=90;Height=25;Anchors=tl;Caption=Annuler;
button=ButtonNext;Left=155;Top=150;Width=90;Height=25;Anchors=tl;Caption=Exporter >>;
"""

result = parse(BP.CustomForm("Paramètres de l'export", form, 300, 220))
print result
if result["SelectedButton"] == "ButtonNext":

  categ_names = BP.CategName

  CreateSubCategs = result["RadioCreateSubCategs"] == "1"
  AllAccounts = result["CheckBoxAllAccounts"] == "1"
  IncludeHeader = result["CheckBoxHeader"] == "1"
  ReplaceCheck = result["CheckBoxCheck"] == "1"
  SeparateSubCategs = result["RadioSepSubCategs"] == "1"
  EditSepCategs = result["EditSepCategs"]
  
  # Si séparateur de catégories, ajoute les sous-catégories
  if len(EditSepCategs) > 0:
    ExportSubCategs = 1

  if CreateSubCategs: titles = ["Date", "Mode", "Tiers", "Détails", "Catégorie", "Sous-catégorie", "Montant"]
  else: titles = ["Date", "Mode", "Tiers", "Détails", "Catégorie", "Montant"]
  seps = [";", ",", "\t"]
  sep = seps[int(result["ComboSep"])]

  if AllAccounts:
    for account in range(len(BP.Accounts())):
      ExportAccount(account, AllAccounts)
  else:
    ExportAccount(BP.AccountCurrent(), AllAccounts)

Historique

1.4 - 25/08/05
Séparateur Catégories/Sous-Catégories
1.3 - 22/08/05
Remplacer le mode Chq XXXXX par Chèque
1.2 - 22/08/05
Inclusion ou pas de l'en-tête
1.1 - 19/08/05
Export de tous les comptes

Idées d'évolution

23/08/05

22/08/05

21/08/05


Commentaires

Pour modifier le fichier .csv plus aisément, je vous conseille CSVed, un superbe éditeur de fichier CSV gratuit sous Windows.


-- Fabrice